package com.bawei.demo_widget;

import android.content.Context;
import android.content.res.TypedArray;
import android.util.AttributeSet;
import android.util.Log;
import android.view.View;
import android.view.ViewGroup;

/**
 * @author yaotianxue
 * @description
 * @date 2025/5/15
 */
public class MyViewGroup extends ViewGroup {
    private int oritation = 0;
    // java代码 new对象
    public MyViewGroup(Context context) {
        this(context, null);
        Log.d("MyViewGroup", "构造1: ");
    }
    //xml布局
    public MyViewGroup(Context context, AttributeSet attrs) {
        this(context, attrs,0);
        Log.d("MyViewGroup", "构造2: ");
    }
    //属性
    public MyViewGroup(Context context, AttributeSet attrs, int defStyleAttr) {
        this(context, attrs, defStyleAttr,0);
        Log.d("MyViewGroup", "构造3: ");
    }

    public MyViewGroup(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
        super(context, attrs, defStyleAttr, defStyleRes);
        Log.d("MyViewGroup", "构造4: ");
        //获得自定义属性
        TypedArray typedArray = context.obtainStyledAttributes(attrs, R.styleable.MyViewGroup);
        oritation = typedArray.getInteger(R.styleable.MyViewGroup_orientation,0);
        Log.d("TMyViewGroupAG", "获得自定义属性: "+oritation);
        typedArray.recycle(); //必须回收属性，防止内存泄漏
    }

    /**
     *
     * 测量规格32位 = 2位测量模式 + 30位测量大小
     * 1.EXACTLY : 精确测量模式 （具体数、match_parent）
     * 当该视图的 layout_width 或者 layout_height 指定为具体数值或者 match_parent 时生效，表示父视图已经决定了子视图的精确大小，这种模式下 View 的测量值就是 SpecSize 的值。
     *
     * 2.AT_MOST：最大值模式.（wrap_content）
     * 当前视图的 layout_width 或者 layout_height 指定为 wrap_content 时生效，此时子视图的尺寸可以是不超过父视图运行的最大尺寸的任何尺寸。
     *
     * 3.UNSPECIFIED：不指定测量模式
     * 父视图没有限制子视图的大小，子视图可以是想要的任何尺寸，通常用于系统内部，应用开发中很少使用到。比如listview就是这个模式

     *
     */
    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        Log.d("MyViewGroup", "onMeasure: ");
        //测量子view的大小
        measureChildren(widthMeasureSpec,heightMeasureSpec);
        //获得测模式和大小
        int width_mode = MeasureSpec.getMode(widthMeasureSpec);
        int width_size = MeasureSpec.getSize(widthMeasureSpec);
        Log.d("MyViewGroup", "宽度测量模式: "+width_mode);
        Log.d("MyViewGroup", "宽度测量大小: "+width_size);
        int height_mode = MeasureSpec.getMode(heightMeasureSpec);
        int height_size = MeasureSpec.getSize(heightMeasureSpec);
        Log.d("MyViewGroup", "高度测量模式: "+height_mode);
        Log.d("MyViewGroup", "高度测量大小: "+height_size);
        //wrap_content处理
        if ( width_mode == MeasureSpec.AT_MOST){
            width_size = 300;
        }
        if (height_mode == MeasureSpec.AT_MOST){
            height_size = 300;
        }
        //设置最终的宽高
        setMeasuredDimension(width_size,height_size);
    }

    //摆放子控件的位置
    int width = 0;
    int height = 0;
    @Override
    protected void onLayout(boolean changed, int l, int t, int r, int b) {
//        Log.d("MyViewGroup", "onLayout: ");
//
//        View view1 = getChildAt(0);
//        Log.d("MyViewGroup", "子控件: "+view1.getMeasuredHeight());
//        view1.layout(0,0,view1.getMeasuredWidth(),view1.getMeasuredHeight());
//        width += view1.getMeasuredWidth();
//        View view2 = getChildAt(1);
//        view2.layout(width,0,width+view2.getMeasuredWidth(),view2.getMeasuredHeight());

        int childCount = getChildCount();
        for (int i = 0; i < childCount; i++){
            View view = getChildAt(i);
            if (oritation == 0){
                view.layout(width,0,width+view.getMeasuredWidth(),view.getMeasuredHeight()); //必须得测量子控件的大小，不然获得不到
                width += view.getMeasuredWidth();
            }else {
                view.layout(0,height,view.getMeasuredWidth(),height+view.getMeasuredHeight());
                height += view.getMeasuredHeight();
            }
        }


    }
}
